prenos souboru po pres TServerSocket a TClientSocket

Otázka od: Tomas Bradle

29. 5. 2004 15:55

Zdravim vsechny,

chci posilat po siti binarni data pres dvojici TClientSocket a TServerSocket
a nejak mi to nechodi. Tak jsem to cele zjednodusil do nasledujiciho
prikladu. Mam dva programy - jedem pro server a jeden pro klienta. Z klienta
posilam soubor na server.

toto je kus kodu serveru:
=========================
procedure TfrTSSvrMain.ssFileClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
FStream:=TFileStream.Create('C:\xy.jpg', fmCreate);
end;

procedure TfrTSSvrMain.ssFileClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
FStream.free;
end;

procedure TfrTSSvrMain.ssFileClientRead(Sender: TObject; Socket:
TCustomWinSocket);
var
  sz: integer;
  p: pointer;
begin
sz:=Socket.ReceiveLength;
GetMem(p, sz);
try
  Socket.ReceiveBuf(p^, sz);
  if Assigned(FStream) then
    FStream.WriteBuffer(p^, sz);
 finally
  FreeMem(p);
 end; {try}
end;

toto je kus kodu klienta:
=========================
procedure TfrTSCliMain.SpeedButton2Click(Sender: TObject);
var
  fs: TFileStream;
  p: pointer;
begin
csFile.Address:=eIP.Text;
csFile.Active:=true;
try
  fs:=TFileStream.Create('c:\x.jpg', fmOpenRead);
  try
    GetMem(p, fs.size);
    try
      fs.ReadBuffer(p^, fs.size);
      csFile.Socket.SendBuf(p^, fs.size);
     finally
      FreeMem(p);
     end; {try}
   finally
    fs.free;
   end; {try}
 finally
  csFile.Active:=false;
 end; {try}
end;

Ten obrazek mi prijde zmrsenej, horni cast je OK ale potom se "rozjede
obraz".
Zdroj ma 204591 bajtu, cil ma 239455 bajtu, cili naroste.

Nevi nekdo cim by to mohlo bejt ? Mam D5 a oba pocitace jsou na W2K SP2.
ClientType i ServerType je ctNonBlocking.

diky
Tomas Bradle
t.bradle@worldonline.cz